package com.qf.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

/**
 * @author zjw
 * @description
 * @date 2021/9/28$ 15:13$
 */
public class WriteLogAdvice {


    // 环绕增强
    public Object around(ProceedingJoinPoint pjp){
        Object result = null;
        try {
            System.out.println("我是环绕。。。前置");
            // 执行被代理类的原方法，不写，不执行
            result = pjp.proceed(pjp.getArgs());
            System.out.println("我是环绕。。。后置");
        } catch (Throwable throwable) {
            System.out.println("我是环绕。。。异常");
            throwable.printStackTrace();
        } finally {
            System.out.println("我是环绕。。。最终");
        }
        return result;
    }

    // 前置增强
    public void writeLog(JoinPoint jp){
        System.out.println("输出日志！！！！！！！");

    }

    // 后置增强
    public void afterReturning(JoinPoint jp,Object result){
        // 被代理对象
        Object target = jp.getTarget();
        // 获取被代理方法参数
        Object[] args = jp.getArgs();
        // 获取被代理方法的名字
        String name = jp.getSignature().getName();
        System.out.println("被代理对象为：" + target);
        System.out.println("被代理方法参数：" + Arrays.toString(args));
        System.out.println("被代理方法名：" + name);
        System.out.println("我是后置增强！！！！返回结果为：" + result);
    }

    // 异常增强
    public void afterThrowing(Throwable ex){
        System.out.println("我是异常增强~~~~~~~抛出的异常为：" + ex.getMessage());
    }

    // 最终增强
    public void after(){
        System.out.println("我是finally代码块中的内容~~~~~~");
    }

}
